/**
 * 用户数据访问层接口
 * 
 * 功能说明：
 * - 提供用户相关的数据库操作接口
 * - 继承JpaRepository，获得基本的CRUD操作能力
 * - 提供自定义查询方法，支持用户名、邮箱、手机号等字段查询
 * - 支持存在性检查，用于数据验证和唯一性约束
 * 
 * 查询方法说明：
 * - findByUsername：根据用户名查询用户，用于用户名登录
 * - findByEmail：根据邮箱查询用户，用于邮箱登录和找回密码
 * - findByPhoneNumber：根据手机号查询用户，用于手机号登录
 * - existsByUsername：检查用户名是否存在，用于注册验证
 * - existsByEmail：检查邮箱是否存在，用于注册验证
 * - existsByPhoneNumber：检查手机号是否存在，用于注册验证
 * 
 * 设计原则：
 * - 返回Optional类型，避免null指针异常
 * - 使用方法名派生查询，遵循Spring Data JPA规范
 * - 提供存在性检查方法，支持业务层数据验证
 * 
 * 使用场景：
 * - 用户登录：根据用户名/邮箱/手机号查询用户信息
 * - 用户注册：检查用户名/邮箱/手机号是否已存在
 * - 用户信息管理：查询和更新用户基本信息
 * - 权限管理：获取用户详细信息进行权限判断
 * 
 * @author eCommerce Team
 * @version 1.0
 */
package com.ecommerce.auth.repository;

import com.ecommerce.auth.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
 * 用户数据访问层接口
 * 提供用户相关的数据库操作和查询方法
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名（不区分大小写）
     * @return 包含用户的Optional对象，如果未找到则返回Optional.empty()
     */
    Optional<User> findByUsername(String username);

    /**
     * 根据邮箱查询用户
     * 
     * @param email 邮箱地址（不区分大小写）
     * @return 包含用户的Optional对象，如果未找到则返回Optional.empty()
     */
    Optional<User> findByEmail(String email);

    /**
     * 根据手机号查询用户
     * 
     * @param phoneNumber 手机号码
     * @return 包含用户的Optional对象，如果未找到则返回Optional.empty()
     */
    Optional<User> findByPhoneNumber(String phoneNumber);

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return true表示存在，false表示不存在
     */
    Boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱地址
     * @return true表示存在，false表示不存在
     */
    Boolean existsByEmail(String email);

    /**
     * 检查手机号是否存在
     * 
     * @param phoneNumber 手机号码
     * @return true表示存在，false表示不存在
     */
    Boolean existsByPhoneNumber(String phoneNumber);
}